﻿#define Debug
using Spire.Pdf;
using Spire.Pdf.General.Find;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace PDFRun
{

    public struct ArgsParser
    {
        public int type;
        public string font;

        //public static ArgsParser CreaterFromStr(PdfDocument document, string arg)
        //{
        //    string[] args = arg.Split(' ');
        //    document.Pages[int.Parse(args[1])].FindText(args[2], TextFindParameter.None).Finds;
        //}
    }

    internal class PdfPaperParser
    {
        const char Null = (char)0x0;
        const char Space = (char)0x20;
        const char Wrap = (char)0x0A;
        const char CR = (char)0x0D;
        const char Dot = (char)0x2E;
        const char Min = (char)0x20;

        public static void Parser()
        {
            Stack<string> sentence = new Stack<string>();

            PdfDocument document = new();

            StringBuilder segment = new();
            StringBuilder segmentL = new();
            StringBuilder segmentR = new();

            Queue<string> lines = new();

            Dictionary<float, Queue<PdfTextFind>> _colStrs = new();
            Dictionary<float, StringBuilder> segments = new();

            List<PdfTextFind> leftStrs = new();
            List<PdfTextFind> rightStrs = new();

            List<string> segmentsL = new();
            List<string> segmentsR = new();

            Console.WriteLine("输入[类型 页数 标记文字]");

            foreach (var pdfPath in Directory.GetFiles(Directory.GetCurrentDirectory(), "*.pdf"))
            {
                Paper paper = new(pdfPath);
                paper.SaveTxt();
//                string fileNameNoEx = Path.GetFileNameWithoutExtension(pdfPath);
//                string? directoryName = Path.GetDirectoryName(pdfPath);
//                document.LoadFromFile(pdfPath);
//                Paper paper = new($"{directoryName}\\ret_{fileNameNoEx}.txt");
//#if Debug
//                using FileStream debugFS = File.Open($"{directoryName}\\_debug_{fileNameNoEx}.txt", FileMode.OpenOrCreate);
//                using FileStream tempFS = File.Open($"{directoryName}\\_temp_{fileNameNoEx}.txt", FileMode.OpenOrCreate);
//                using StreamWriter debugWriter = new(debugFS);
//                using StreamWriter tempWriter = new(tempFS);
//#endif
//                foreach (PdfPageBase page in document.Pages)
//                {
//                    float leftLimit = page.Size.Width / 2;
//                    leftStrs.Clear();
//                    rightStrs.Clear();
//                    segmentsL.Clear();
//                    segmentsR.Clear();
//                    segmentR.Clear();
//                    segmentL.Clear();

                //                    //page.FindText("\\[.*\\]", TextFindParameter.Regex);

                //                    foreach (PdfTextFind txtFind in page.FindAllText().Finds)
                //                    {
                //                        if (txtFind.Position.X > leftLimit)
                //                        {
                //                            rightStrs.Add(txtFind);

                //                            segmentR.Append(txtFind.MatchText);
                //                        }
                //                        else
                //                        {
                //                            leftStrs.Add(txtFind);
                //                            segmentL.Append(txtFind.MatchText);
                //                        }
                //#if Debug
                //                        debugWriter.WriteLine(
                //                            $"FontName: [{txtFind.FontName}] " +
                //                            $"MatchText: [{txtFind.MatchText}] " +
                //                            $"Size.Height: [{txtFind.Position}] " +
                //                            $"Size.Height: [{txtFind.Size.Height}] "
                //                            );
                //#endif

                //                    }
                //                    debugWriter.WriteLine("======================");
                //                    debugWriter.WriteLine(segmentL);
                //                    debugWriter.WriteLine(segmentR);

                //                    //合并Y相等的
                //                    tempWriter.WriteLine("============= Page Right");

                //                    float curY = 0;
                //                    foreach (var r in rightStrs)
                //                    {
                //                        if (r.Position.Y < curY - 4 || r.Position.Y > curY + 4)
                //                        {
                //                            curY = r.Position.Y;
                //                            if (segment.Length > 0)
                //                            {
                //                                string s = segment.ToString();
                //                                segmentsR.Add(s);

                //                                tempWriter.WriteLine(s);

                //                                segment.Clear();
                //                            }
                //                        }
                //                        else
                //                        {
                //                            segment.Append(r.MatchText);
                //                        }
                //                    }

                //                    if (segment.Length > 0)
                //                    {
                //                        string s = segment.ToString();
                //                        segmentsR.Add(s);

                //                        tempWriter.WriteLine(s);

                //                        segment.Clear();
                //                    }

                //                    tempWriter.WriteLine("============= Page Left");

                //                    curY = 0;
                //                    foreach (var l in leftStrs)
                //                    {
                //                        if (curY < l.Position.Y - 4 || curY > l.Position.Y + 4)
                //                        {
                //                            curY = l.Position.Y;
                //                            if (segment.Length > 0)
                //                            {
                //                                string s = segment.ToString();
                //                                segmentsL.Add(s);

                //                                tempWriter.WriteLine(s);

                //                                segment.Clear();
                //                            }
                //                        }
                //                        else
                //                        {
                //                            segment.Append(l.MatchText);
                //                        }
                //                    }

                //                    if (segment.Length > 0)
                //                    {
                //                        string s = segment.ToString();
                //                        segmentsL.Add(s);

                //                        tempWriter.WriteLine(s);

                //                        segment.Clear();
                //                    }

                //                    //tempWriter.WriteLine("========= Page Start");
                //                    //foreach (var item in segments.Values)
                //                    //{
                //                    //    tempWriter.WriteLine(item);
                //                    //}
                //                    tempWriter.WriteLine("========= Page End");
                //                }
                document.Close();
                Console.WriteLine($"处理完成！");
            }
        }
    }
}
